import common from '../../assets/common'
import router from '../../router'
import store from '../../utils/vuex/store'

const appName = process.env.APP_NAME
axios.defaults.baseURL = process.env.API_PATH
axios.defaults.timeout = 5000

// 创建一个错误
function errorCreate(msg) {
  const err = new Error(msg)
  // 显示提示
  common.error(err.message)
  // 控制台抛出错误
  throw err
}

// 请求拦截器
axios.interceptors.request.use(
  config => {
    // 在请求发送之前做一些处理
    // json格式请求
    config.headers['Content-Type'] = 'application/json;charset=utf-8'
    // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
    config.headers[`${appName}-token`] = store.getters.token || ''
    return config
  }, error => {
    // 发送失败
    errorCreate(error)
    return Promise.reject(error)
  }
)

// 响应拦截器
axios.interceptors.response.use(
  response => {
    // dataAxios 是 axios 返回数据中的 data
    const dataAxios = response.data
    // 这个状态码是和后端约定的
    const {code} = dataAxios
    // 根据 code 进行判断
    if (code === undefined) {
      // 如果没有 code 代表这不是项目后端开发的接口
      return errorCreate('接口返回格式错误')
    }
    // 有 code 代表这是一个后端接口 可以进行进一步的判断
    switch (code) {
      case 0:
        // [ 示例 ] code === 0 代表没有错误
        return dataAxios.data
      case 'xxx':
        // [ 示例 ] 其它和后端约定的 code
        errorCreate(`[ code: xxx ] ${dataAxios.msg}: ${response.config.url}`)
        break
      default:
        // 不是正确的 code
        errorCreate(`${dataAxios.msg}`)
        break
    }
  }, error => {
    if (error && error.response) {
      switch (error.response.status) {
        case 400:
          error.message = '请求错误';
          break
        case 401:
          error.message = '未授权，请输入账号'
          store.dispatch('setLogout')
          break
        case 403:
          error.message = '拒绝访问';
          break
        case 404:
          error.message = `抱歉，由于版本原因导致部分请求不存在`;
          break
        case 408:
          error.message = '请求超时';
          break
        case 500:
          error.message = '服务器内部错误';
          break
        case 501:
          error.message = '服务未实现';
          break
        case 502:
          error.message = '网关错误';
          break
        case 503:
          error.message = '服务不可用';
          break
        case 504:
          error.message = '网关超时';
          break
        case 505:
          error.message = 'HTTP版本不受支持';
          break
        default:
          break
      }
    }
    errorCreate(error)
    return Promise.reject(error)
  }
)

const request = {}

request.post = function (params) {
  return axios({
    method: 'post',
    url: params.url,
    data: JSON.stringify(params.data),
  })
}

request.get = function (url, params) {
  return axios({
    method: 'get',
    url: url,
    params: params,
  })
}

request.delete = function (url, params) {
  return axios({
    method: 'delete',
    url,
    params,
  })
}

request.patch = function (url, params) {
  return axios({
    method: 'patch',
    url,
    params,
  })
}

export default request
